package cn.tedu.collection;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.ListIterator;

/**本类用于ArrayList的相关测试*/
public class TestArrayList {
    public static void main(String[] args) {
        //1.创建对应的集合对象
        /**底层会自动帮我们创建数组来存放对象，并且数组的初始容量是10，即长度list.size()*/
        ArrayList<Integer> list = new ArrayList<>();
        //2.向集合中添加元素，用于测试
        list.add(100);
        list.add(200);
        list.add(300);
        list.add(400);
        list.add(400);
        list.add(300);
        System.out.println(list);
        System.out.println(list.size());

        //3.测试常用方法 继承
//        list.clear();//清空集合
//        System.out.println(list);//[]

        System.out.println(list.contains("100"));//false，是否包含指定元素"100"，不包含，这是String，不是Integer
        System.out.println(list.contains(100));//true

        System.out.println(list.get(0));//100

        System.out.println(list.indexOf(400));//3判断元素第1次出现的下标
        System.out.println(list.lastIndexOf(400));//4判断元素最后1次出现的下标

//        System.out.println(list.remove(300));//报错，下标越界
        /**上面的果想指定元素来删除数据，需要把int类型的300手动装箱成Integer类型的300元素*/
        System.out.println(list.remove(Integer.valueOf(300)));//根据具体元素删除元素
        System.out.println(list.remove(2));//根据下标删除元素
        System.out.println(list);

        System.out.println(list.set(2,777));//修改指定位置处的元素为777
        System.out.println(list);
        System.out.println(list.size());//4，获取集合中的元素个数


        ArrayList<Integer> list2 = new ArrayList<>();
        list2.add(1);
        list2.add(2);
        list2.add(3);
        list2.add(4);
        System.out.println(list2);

        list.addAll(list2);//将list2集合中的所有元素添加到list集合的末尾处
        System.out.println(list);
        list.addAll(0,list2);//将list2集合中的所有元素从list集合的0号位置开始添加
        System.out.println(list);
        System.out.println(list.containsAll(list2));

        System.out.println("-----------------------------");
        list.removeAll(list2);//删除list集合中所有list2集合的元素
        System.out.println(list);

        System.out.println(list.containsAll(list2));//false,判断list集合中是否包含list2集合中的所有元素

        list.add(1);
        System.out.println("---------------------------------");
        System.out.println(list);
        System.out.println(list.containsAll(list2));
        System.out.println(list.removeAll(list2));
        System.out.println(list);

        list.add(2);
        list.retainAll(list2);//取交集，保留list中属于list2的所有元素
        System.out.println(list);

        System.out.println("******方式1******");
        list.add(5);
        list.add(6);
        list.add(7);
        list.add(8);
        list.add(9);
        //测试集合的迭代
        /**1.for循环
         * 2.高效for循环
         * 3.iterator
         * 4.listIterator*/
        //方式1：因为List集合是有序的，元素是有下标的，所以可以根据下标进行遍历
        //从哪开始：0 到哪结束：list.size()-1 如何变化：++
        for (int i = 0; i <= list.size()-1; i++) {
            System.out.println(list.get(i));

        }
        System.out.println("----------**********----------");
        System.out.println("******方式2******");
        //方式2：因为普通for循环遍历效率低，语法复杂，所以使用高效for循环来遍历
        //格式：for(每轮遍历到的元素的类型 元素名 : 要遍历的元素/内容){循环体}
        for (Integer n:
             list) {
            System.out.println(n);
        }
        System.out.println("******方式2******");
        System.out.println("******方式3******");
        //方式3：从父接口Collection中继承过来的迭代器iterator   集合的方法
        //1.获取要迭代集合对应的迭代器             集合.iterator();
        //2.通过迭代器判断是否有下一个元素可以迭代      变量名.hasNext()
        //3.通过迭代器获取本轮迭代到的元素        变量名.next();
        Iterator<Integer> it = list.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
        System.out.println("******方式3******");
        System.out.println("******方式4******");
        /**方式4：ListIterator属于List接口独有的迭代器
         * Iterator<E> -- 父接口--hasNext()  next()
         * ListIterator<E> -- 子接口 -- 可以使用父接口的功能,除了父接口的功能之外
         * 还有自己特有的功能，比如逆序遍历，添加元素等，但注意，不常用
         * public interface ListIterator<E> extends Iterator<E>*/
        ListIterator<Integer> it2 = list.listIterator();
        while (it2.hasNext()){
            System.out.println(it2.next());
        }
    }
}
